声明变量 let
功能和var
类似,却去掉了很多var
身上的坏毛病
-
块状作用域
{ var a = '123'; } { let b = '456' } // 如果在浏览器环境执行的时候 console.log(a);// '123' console.log(b);// b is not defined
-
不会往全局变量上面绑定,防止全局变量的污染
var a = '123'; let b = '456'; // 直接结果 console.log(window.a);// '123' console.log(window.b);// undefined;
-
相同作用域中不允许重复声明相同变量
let a = '123'; let a = '456'; // 执行结果 console.log(a);// 抛出语法错误:SyntaxError: Identifier 'me' has already been declared
-
经典的例子
for(var i=1;i<10;i++){ } console.log(i); // 输出10,一不小心就污染了全局环境 // 使用let,就不会有这个问题 for(let j=1;j<10;j++){ } console.log(j); // 抛出引用异常:ReferenceError: j is not defined
声明常量 const
在es6
之前并没有很好的办法进行常量的声明,常量:这是一个只读的变量,es6
中给出了const
这个特性,专门用来处理这类问题
const a = '123';
a = '456'; // 抛出异常 SyntaxError: "a" is read-only
需要注意下,常量的对象,其中的属性是可以被改变的
const obj = {
name:'hello'
}
obj.name = 'hello 2'; // 这个地方是合法的
for...of
这es6
提供的一个新的迭代器,功能类似for...in
,只是前者返回的是value,而后者返回的是脚标
let data = ['a','b','c'];
for(let i in data){
console.log(i);// 输出 0,1,2
}
for(let j of data){
console.log(j);// 输出 a,b,c
}
代理 Proxies
这是es6
提供的一个强大的特性,可以通过非侵入的方式,修改对象的默认行为
var obj = {
name:'dog'
};
var handler = {
get:function(target,key){
return target[key].replace('dog','cat');
}
};
// 设置代理
var proxy = new Proxy(obj,handler);
console.log(proxy.name);
可以进行代理的属性还有很多:
var handler = {
get:...,
set:...,
has:...,
deleteProperty:...,
apply:...,
construct:...,
getOwnPropertyDescriptor:...,
defineProperty:...,
getPrototypeOf:...,
setPrototypeOf:...,
enumerate:...,
ownKeys:...,
preventExtensions:...,
isExtensible:...
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。